Set the new state flag
authorMatthias Clasen <mclasen@redhat.com>
Tue, 29 Aug 2017 02:25:06 +0000 (22:25 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 25 Oct 2017 21:49:43 +0000 (17:49 -0400)
For now, we only set the new visible focus state
on the focus widget, when we have visible focus.
Later on, we will allow setting it on other widgets.

gtk/gtkwidget.c

index 3637712a1f3ba6b6a4a3981147b9447851c52121..c0977d545d1d13ea595c80282af11a25ae615191 100644 (file)
@@ -15479,10 +15479,20 @@ gtk_widget_set_focus_child (GtkWidget *widget,
     }
 
   if (priv->focus_child)
-    gtk_widget_unset_state_flags (priv->focus_child, GTK_STATE_FLAG_FOCUSED);
+    gtk_widget_unset_state_flags (priv->focus_child,
+                                  GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_FOCUS_VISIBLE);
 
   if (child)
-    gtk_widget_set_state_flags (child, GTK_STATE_FLAG_FOCUSED, FALSE);
+    {
+      GtkWidget *toplevel;
+      GtkStateFlags flags = GTK_STATE_FLAG_FOCUSED;
+
+      toplevel = _gtk_widget_get_toplevel (widget);
+      if (!GTK_IS_WINDOW (toplevel) || gtk_window_get_focus_visible (GTK_WINDOW (toplevel)))
+        flags |= GTK_STATE_FLAG_FOCUS_VISIBLE;
+
+      gtk_widget_set_state_flags (child, flags, FALSE);
+    }
 
   g_set_object (&priv->focus_child, child);